package com.example.service;

import com.example.common.Result;
import com.example.common.PageResult;
import com.example.dto.AppointmentDTO;
import com.example.vo.AppointmentVO;
import com.example.vo.StoreManagerScheduleVO;
import com.example.vo.TimeSlotAvailabilityVO;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

/**
 * 预约服务接口
 */
public interface AppointmentService {
    
    /**
     * 创建预约
     */
    Result<Void> createAppointment(AppointmentDTO appointmentDTO);
    
    /**
     * 取消预约
     */
    Result<Void> cancelAppointment(Long appointmentId);
    
    /**
     * 根据ID查询预约详情
     */
    Result<AppointmentVO> getAppointmentById(Long id);
    
    /**
     * 获取当前用户的预约列表
     */
    Result<List<AppointmentVO>> getMyAppointments();
    
    /**
     * 获取当前店长的预约列表
     */
    Result<List<AppointmentVO>> getStoreManagerAppointments();

    /**
     * 获取当前店长的预约列表（支持条件搜索）
     */
    Result<List<AppointmentVO>> getStoreManagerAppointments(String startDate, String endDate,
                                                           Integer status, String serviceType);
    
    /**
     * 分页查询预约记录
     */
    Result<PageResult<AppointmentVO>> getAppointmentPage(int page, int size, 
                                                        Long userId, Long storeManagerId, 
                                                        Integer status);
    
    /**
     * 管理员分页查询所有预约记录
     */
    Result<PageResult<AppointmentVO>> getAdminAppointmentPage(int page, int size,
                                                             String username, String storeManagerName,
                                                             Integer status, String packageName,
                                                             String startDate, String endDate);
    
    /**
     * 获取所有店长的排班时间表
     */
    Result<List<StoreManagerScheduleVO>> getAllStoreManagerSchedules();
    
    /**
     * 根据店长ID获取排班时间表
     */
    Result<StoreManagerScheduleVO> getStoreManagerSchedule(Long storeManagerId);
    
    /**
     * 确认预约
     */
    Result<Void> confirmAppointment(Long appointmentId);
    
    /**
     * 完成预约
     */
    Result<Void> completeAppointment(Long appointmentId);
    
    /**
     * 获取店长在特定日期的可用时间段
     */
    Result<List<Integer>> getStoreManagerAvailableHours(Long storeManagerId, LocalDate appointmentDate);
    
    /**
     * 根据日期获取所有有排班的发型师及其可用时间段
     */
    Result<List<StoreManagerScheduleVO>> getAvailableStoreManagersByDate(LocalDate appointmentDate);
    
    /**
     * 根据发型师ID获取其未来可用的日期排班
     */
    Result<Map<String, List<Integer>>> getStoreManagerAvailableDates(Long storeManagerId, int days);
    
    /**
     * 获取店长在特定日期的时间段可用性信息（包含剩余名额）
     */
    Result<List<TimeSlotAvailabilityVO>> getStoreManagerTimeSlotAvailability(Long storeManagerId, LocalDate appointmentDate);
} 